package cn.edu.buu.hospital.web;

import cn.edu.buu.hospital.entity.Hospital;
import cn.edu.buu.hospital.service.HospitalService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import jakarta.servlet.http.HttpServletRequest;

import java.time.LocalDateTime;

/**
 * 医院管理控制类
 * 负责处理医院相关的HTTP请求，包括新增医院、查询医院、更新医院、删除医院等功能
 */
@Controller
@RequestMapping("/hospital")
public class HospitalController {

    @Autowired
    private HospitalService hospitalService; // 注入医院服务，处理医院相关的业务逻辑

    /**
     * 跳转到新增医院页面
     * @return 医院新增页面的视图路径
     */
    @GetMapping("/toAdd")
    public String toAdd() {
        return "backend/hospital/add"; // 返回新增医院页面
    }

    /**
     * 新增医院
     * @param hospitalname 医院名称
     * @param address 医院地址
     * @param hphone 医院电话
     * @param model 模型对象，用于传递数据到视图
     * @return 成功则重定向到医院列表页面，失败则重定向到新增页面
     */
    @PostMapping("/add")
    @Transactional
    public String add(@RequestParam("hospitalname") String hospitalname,
                     @RequestParam("address") String address,
                     @RequestParam("hphone") String hphone,
                     Model model) {
        try {
            // 创建医院对象并设置属性
            Hospital hospital = new Hospital();
            hospital.setHospitalname(hospitalname);
            hospital.setAddress(address);
            hospital.setHphone(hphone);
            
            // 调用服务层保存医院信息
            hospitalService.add(hospital);
            return "redirect:find"; // 新增成功后重定向到医院列表页面
        } catch (Exception e) {
            // 保存错误信息到session，因为重定向会丢失model
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            request.getSession().setAttribute("error", "新增失败: " + e.getMessage());
            
            // 创建临时对象保存用户输入
            Hospital temp = new Hospital();
            temp.setHospitalname(hospitalname);
            temp.setAddress(address);
            temp.setHphone(hphone);
            request.getSession().setAttribute("addHospital", temp);
            
            return "redirect:toAdd"; // 新增失败后重定向到新增页面
        }
    }

    /**
     * 分页查询医院列表
     * @param model 模型对象，用于传递数据到视图
     * @param pageNum 当前页码，默认为1
     * @param condition 查询条件对象
     * @return 医院列表页面的视图路径
     */
    @RequestMapping(value = "/find", method = {RequestMethod.GET, RequestMethod.POST})
    public String find(Model model,
                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                      Hospital condition) {
        int pageSize = 5;
        // 调用service层方法进行分页查询
        PageInfo<Hospital> pageInfo = hospitalService.find(pageNum, pageSize, condition);
        
        // 将查询结果和条件添加到model中
        model.addAttribute("pageInfo", pageInfo);
        model.addAttribute("condition", condition);
        return "backend/hospital/list"; // 返回医院列表页面
    }

    /**
     * 跳转到编辑医院页面
     * @param hospitalId 医院ID
     * @param model 模型对象，用于传递数据到视图
     * @return 医院编辑页面的视图路径
     */
    @GetMapping("/toEdit")
    public String toEdit(@RequestParam("hospitalId") Long hospitalId, Model model) {
        // 根据ID查询医院信息
        Hospital hospital = hospitalService.findById(hospitalId);
        if (hospital == null) {
            hospital = new Hospital();
            hospital.setHospitalid(hospitalId);
        }
        model.addAttribute("hospital", hospital);
        return "backend/hospital/edit"; // 返回编辑页面
    }

    /**
     * 根据ID查询医院详情（用于编辑）
     * @param hospitalId 医院ID
     * @param model 模型对象，用于传递数据到视图
     * @return 医院编辑页面的视图路径
     */
    @GetMapping("/findById")
    public String findById(@RequestParam("hospitalId") Long hospitalId, Model model) {
        // 根据ID查询医院信息
        Hospital hospital = hospitalService.findById(hospitalId);
        if (hospital == null) {
            hospital = new Hospital();
            hospital.setHospitalid(hospitalId);
        }
        model.addAttribute("hospital", hospital);
        return "backend/hospital/edit"; // 返回编辑页面
    }

    /**
     * 修改医院信息
     * @param hospitalid 医院ID
     * @param hospitalname 医院名称
     * @param address 医院地址
     * @param hphone 医院电话
     * @param model 模型对象，用于传递数据到视图
     * @return 成功则重定向到医院列表页面，失败则重定向到编辑页面
     */
    @PostMapping("/modify")
    @Transactional
    public String modify(@RequestParam("hospitalid") Long hospitalid,
                        @RequestParam("hospitalname") String hospitalname,
                        @RequestParam("address") String address,
                        @RequestParam("hphone") String hphone,
                        Model model) {
        try {
            // 创建医院对象并设置属性
            Hospital hospital = new Hospital();
            hospital.setHospitalid(hospitalid);
            hospital.setHospitalname(hospitalname);
            hospital.setAddress(address);
            hospital.setHphone(hphone);
            
            // 调用服务层更新医院信息
            hospitalService.modify(hospital);
            return "redirect:find"; // 修改成功后重定向到医院列表页面
        } catch (Exception e) {
            // 保存错误信息和表单数据到session，因为重定向会丢失model
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            request.getSession().setAttribute("error", "修改失败: " + e.getMessage());
            
            // 创建临时对象保存用户输入
            Hospital temp = new Hospital();
            temp.setHospitalid(hospitalid);
            temp.setHospitalname(hospitalname);
            temp.setAddress(address);
            temp.setHphone(hphone);
            request.getSession().setAttribute("editHospital", temp);
            
            return "redirect:toEdit?hospitalId=" + hospitalid; // 修改失败后重定向到编辑页面
        }
    }

    /**
     * 删除医院
     * @param hospitalId 医院ID
     * @return 重定向到医院列表页面
     */
    @GetMapping("/removeById")
    @Transactional
    public String removeById(@RequestParam("hospitalId") Long hospitalId) {
        try {
            // 调用服务层删除指定ID的医院
            hospitalService.removeById(hospitalId);
            return "redirect:find"; // 删除成功后重定向到医院列表页面
        } catch (Exception e) {
            // 保存错误信息到session
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            request.getSession().setAttribute("error", "删除失败: " + e.getMessage());
            return "redirect:find"; // 删除失败后重定向到医院列表页面
        }
    }
}